package fr.auzaiphe.admin.model;

import java.util.ArrayList;

import fr.auzaiphe.admin.bdd.BaseDeDonnee;
import fr.auzaiphe.admin.bdd.JoueurBDD;
/**
 *
 * @author Hugp
 * Joueur d'une partie/scénario.
 */
public class Joueur extends Utilisateur
{
	private JoueurBDD imageBDD;

	private int id;
	private String nomPersonnage;
	private String prenomPersonnage;
	private String backgroundPersonnage;
	private String password;
	private SousChrono chrono;
	private ArrayList<Indice> indicesDispo;
	private ArrayList<Alerte> listAlerteNonVisualiser;
	/**
	 * Constructeur par défaut
	 */
	public Joueur ()
	{

	}

	/**
	 * Constructeur
	 * @param pBdd Base
	 * @param pNomPersonnage
	 * @param pPrenomPersonnage
	 * @param pPassword
	 * @param pBackground
	 * @param pTempsRestant
	 * @param pHisto Historique du jeu.
	 */
	public Joueur( BaseDeDonnee pBdd, AdminModel pModel )
	{
		this.id = -1;
		this.nomPersonnage = "";
		this.prenomPersonnage = "";
		this.password = "";
		this.chrono = new SousChrono(0,this,pModel);

		this.imageBDD = new JoueurBDD( pBdd, this );
		this.imageBDD.afficher();
		this.listAlerteNonVisualiser = new ArrayList<Alerte>();
	}

	/**
	 * Constructeur pour nouveau joueur créé a partir du modèle.
	 * @param pBdd
	 * @param pNomPersonnage
	 * @param pPrenomPersonnage
	 * @param pPassword
	 * @param pBackground
	 * @param pTempsRestant
	 * @param pHisto
	 */
	public Joueur ( BaseDeDonnee pBdd,
					String pNomPersonnage,
					String pPrenomPersonnage,
					String pPassword,
					String pBackground,
					int pTempsRestant,
					AdminModel pModel
				  )
	{
		this.id = -1;
		this.nomPersonnage = pNomPersonnage;
		this.prenomPersonnage = pPrenomPersonnage;
		this.password = pPassword;
		this.backgroundPersonnage = pBackground;
		this.chrono = new SousChrono( pTempsRestant,this,pModel );
		this.indicesDispo = new ArrayList<Indice>();

		this.imageBDD = new JoueurBDD(pBdd, this);
		this.imageBDD.afficher();
		this.listAlerteNonVisualiser = new ArrayList<Alerte>();
	}

	/**
	 * Joueur chargé à partir d'un fichier .murder
	 * @param pId
	 * @param pBdd
	 * @param pNomPersonnage
	 * @param pPrenomPersonnage
	 * @param pPassword
	 * @param pBackground
	 * @param pTempsRestant
	 */
	public Joueur ( int pId,
					BaseDeDonnee pBdd,
					String pNomPersonnage,
					String pPrenomPersonnage,
					String pPassword,
					String pBackground,
					int pTempsRestant,
					AdminModel pModel)
	{
		this.id = pId;
		this.nomPersonnage = pNomPersonnage;
		this.prenomPersonnage = pPrenomPersonnage;
		this.password = pPassword;
		this.backgroundPersonnage = pBackground;
		this.chrono = new SousChrono( pTempsRestant,this,pModel );
		this.indicesDispo = new ArrayList<Indice>();

		this.imageBDD = new JoueurBDD(pBdd, this);
		this.imageBDD.afficher();
		this.listAlerteNonVisualiser = new ArrayList<Alerte>();
	}

	/**
	 * Donne un nouvel indice au joueur
	 * Appeller lors de la modification et l'ajout des indices
	 * @param pNewIndice
	 */
	public void giveIndice(Indice pNewIndice)
	{
		this.indicesDispo.add( pNewIndice );
	}

	/**
	 * Donne un indice à un joueur si celui-ci ne l'a pas encore
	 * Appeller lors de la modification d'un indice
	 * @param pIndice
	 */
	public void ifNotGetGiveIndice(Indice pIndice)
	{
		if ( ! this.indicesDispo.contains( pIndice ) )
		{
			this.indicesDispo.add( pIndice );
		}
	}

	/**
	 * Retire un indice de la liste des indices du joueur
	 * Appeller lors de la modification d'un indice
	 * @param pIndice
	 */
	public void takeIndice(Indice pIndice)
	{
		this.indicesDispo.remove( pIndice );
	}

	public void supprimer()
	{
		this.imageBDD.supprimer();
	}

	public String getNomPersonnage()
	{
		return this.nomPersonnage;
	}
	public String getPrenomPersonnage()
	{
		return this.prenomPersonnage;
	}
	public String getPassword()
	{
		return this.password;
	}
	public SousChrono getChrono()
	{
		return this.chrono;
	}

	public JoueurBDD getImageBDD()
	{
		return this.imageBDD;
	}

	/**
	 * Match le prenomPersonnage et le password du personnage
	 * avec ceux de la tentative de connexion.
	 * On vérifie également le temps restant du joueur
	 * @param pUserName
	 * @param pPassword
	 * @return boolean match or not
	 */
	public boolean match(String pUserName, String pPassword)
	{
		System.out.println( this.prenomPersonnage +" == "+ pUserName );
		System.out.println( this.password +" == "+ pPassword );
		if ( this.prenomPersonnage.equals( pUserName )
			 && this.password.equals( pPassword )
			 && this.chrono.getSecondesRestantes() > 0 )
		{
			return true;
		}
		return false;
	}

	public boolean matchName( String pString, String pString2 )
	{
		if ( this.prenomPersonnage.equals( pString )
			 && this.nomPersonnage.equals( pString2 ) )
		{
			return true;
		}
		return false;
	}

	/**
	 * equals : Nom + prenom joueur = id unique.
	 * @param pJoueur
	 * @return
	 */
	public boolean equals (Joueur pJoueur)
	{
		return
			pJoueur.getNomPersonnage().equals(this.nomPersonnage) &&
			pJoueur.getPassword().equals(this.password);
	}

	/**
	 * @return the backgroundPersonnage
	 */
	public String getBackgroundPersonnage()
	{
		return this.backgroundPersonnage;
	}

	/**
	 * @return Nombre d'indices dispo
	 */
	public int getNbIndices()
	{
		return this.indicesDispo.size();
	}


	public int getTempsRestant()
	{
		return this.chrono.getSecondesRestantes();
	}


	/**
	 * @return the id
	 */
	public int getId()
	{
		return this.id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(int id)
	{
		this.id = id;
	}
	/**
	 * @return the indicesDispo
	 */
	public ArrayList<Indice> getIndicesDispo()
	{
		return this.indicesDispo;
	}

	/**
	 * @param indicesDispo the indicesDispo to set
	 */
	public void setIndicesDispo(ArrayList<Indice> indicesDispo)
	{
		this.indicesDispo = indicesDispo;
	}

	public void setNomPersonnage(String nomPersonnage)
	{
		this.nomPersonnage = nomPersonnage;
	}

	public void setPrenomPersonnage(String prenomPersonnage)
	{
		this.prenomPersonnage = prenomPersonnage;
	}

	public void setBackgroundPersonnage(String backgroundPersonnage)
	{
		this.backgroundPersonnage = backgroundPersonnage;
	}

	public void setPassword(String password)
	{
		this.password = password;
	}

	public void setChrono(SousChrono chrono)
	{
		this.chrono = chrono;
	}

	public void setTempsRestant(int i)
	{
		this.chrono.setTempsRestant(i);
	}

	/**
	 * @return the listAlerteNonVisualiser
	 */
	public ArrayList<Alerte> getListAlerteNonVisualiser()
	{
		return this.listAlerteNonVisualiser;
	}

	/**
	 * @param listAlerteNonVisualiser the listAlerteNonVisualiser to set
	 */
	public void setListAlerteNonVisualiser( ArrayList<Alerte> listAlerteNonVisualiser)
	{
		this.listAlerteNonVisualiser = listAlerteNonVisualiser;
	}
}
